/**
 * usr 接口
 * 注册  /api/v1/register  POST类型
 * 登录  /api/v1/login      POST 类型
 * 个人信息   /api/v1/user   GET类型  用户id通过token获取
*/

const express = require('express')
//字符串加密
const md5 = require('md5')
//签发和验证token 
const jsonwebtoken = require('jsonwebtoken')
//加密的串  随机字符串
const secret = 'hellokkootttuu'
const router = express.Router()
// 导入users模型
const UserModel = require('../models/users')
//加密中间件
const pwdCrypt = (req, res, next) => {
    //获取源密码
    let password = req.body.password
    //加密密码  salt加盐机密  加入一些额外的字符串
    password = md5(md5(password).slice(6, 12))
    //将加密密码重新存回去
    req.body.password = password
    next()
}
//注册  使用密码加密的自定义中间件
router.post('/register', pwdCrypt, (req, res) => {
    //用户注册的信息
    let data = req.body
    //判断用户已经存在[手机号或用户名已经存在],则不注册
    UserModel.findOne({
        $or: [{ username: req.body.username }, { mobile: req.body.mobile }]
    })
        .then((rs) => {
            if (rs) {
                res.send({
                    code: 2,
                    msg: '请不要重复注册',
                    data: {
                        username: rs.username,
                        mobile: rs.mobile,
                        head_url: rs.head_url
                    }
                })
            } else {
                UserModel.insertMany(data).then((rs) => {
                    console.log(rs)
                    if (rs.length > 0) {
                        res.send({
                            code: 0,
                            msg: 'ok',
                            data: {
                                username: rs[0].username,
                                mobile: rs[0].mobile,
                                head_url: rs[0].head_url
                            }
                        })
                    } else {
                        res.send({
                            code: 1,
                            msg: 'register error',
                            data: {}
                        })
                    }
                })
            }
        })
        .catch((e) => {
            console.log(e)
        })
})
// 登录 使用密码加密中间件  密码加密不可逆的  校验密码需要加密之后对比
router.post('/login',pwdCrypt, (req, res) => {
    let data = req.body
    UserModel.findOne(data).then((rs) => {
        if (rs) {
            res.send({
                code: 0,
                msg: 'ok',
                data: {
                    username: rs.username,
                    mobile: rs.mobile,
                    head_url: rs.head_url,
                    //token  登录成功之后   返回token
                    //payload  参数  secret  密钥
                    token: jsonwebtoken.sign(
                        {
                            uid: rs._id,
                            expire: Math.ceil(new Date().getTime() / 1000) + 7200
                        },
                        //加密的字符串  必须存储服务器   不能发送给浏览器客户端
                        secret
                    )
                }
            })
        } else {
            res.send({
                code: 1,
                msg: '用户名|手机号或者密码错误',
                data: {}
            })
        }
    })
})

const checkToken = (req, res, next) => {
    //获取客户端传递toke                                                                                                                                                  n header authorization
    let token = req.headers.authorization
    //校验token是否有效
    try {
        //try里面的代码执行  报错不会直接输出  捕获
        let payload = jsonwebtoken.verify(token, secret)
        req.payload = payload
    } catch (e) {
        //e  try里面报错  通过e接收
        console.log(e)
        res.send({
            code: 1,
            msg: 'token错误,请重新登录获取token'
        })
    }
    next()
}
//查询个人信息 token
//先校验tokeny有效性  自定义中间件
router.get('/user', checkToken, (req, res) => {
    //根据用户携带的token进行获取个人信息
    UserModel.findOne({ _id: req.payload.uid }).then((rs) => {
        if (rs) {
            res.send({
                code: 0,
                msg: 'ok',
                data: {
                    username: rs.username,
                    mobile: rs.mobile,
                    head_url: rs.head_url,
                    //token 登录成功之后 返回token
                    //payload 参数 secret  密钥
                    token: jsonwebtoken.sign(
                        {
                            uid: rs._id,
                            expire: Math.ceil(new Date().getTime() / 1000) + 7200
                        },
                        //加密的字符串  必须存储服务器端  不能发送给浏览器客户端
                        secret
                    )
                }
            })
        } else {
            res.send({
                code: 1,
                msg: '服务器错误!',
                data: {}
            })
        }
    })
})

module.exports = router